#include "retorne.h"

Retorne::Retorne(Sentencia *next, Expr *expr, int fila, int col):Sentencia(next,fila,col)
{
    this->expr=expr;
}

string Retorne::is()
{
    return "RETORNE";
}

void Retorne::setExpr(Expr *expr)
{
    this->expr=expr;
}

Expr *Retorne::getExpr()
{
    return this->expr;
}

Tipo_ts *Retorne::validarSemantica(Tabla_Simbolos *tabla_de_tipo, Tabla_Simbolos *tabla_de_varaible)
{
    Tipo_ts *tts = this->expr->validarSemantica(tabla_de_tipo,tabla_de_varaible);
            Tipo_ts *retorne = this->GetReturn();
            if(retorne!=0){
                if(tts->is().compare(this->GetReturn()->is())==0){
                    return tts;
                }else{
                    stringstream out;
                out<<"Tipo de Retorno no es correcto// Fila:"<<this->getFila()<<endl;
                throw exception(out.str().c_str());
                }
            }else{
                stringstream out;
                out<<"Retorne solo se puede llamar dentro de una funcion// Fila:"<<this->getFila()<<endl;
                throw exception(out.str().c_str());
            }
}

string Retorne::generarCodigo(GenerarVariable *var, Tabla_Simbolos *tabla_de_tipo, Tabla_Simbolos *tabla_de_varaible)
{
    string codigo;
    codigo = "return "+ this->expr->generarCodigo(var,tabla_de_tipo,tabla_de_varaible).codigo;
    return codigo;
}

